/********************************
* name:	配置管理模块
* func:	1.读取配置
				2.变比设置
				3.阈值设置
				4.参数存储
********************************/
#include "config_manager.h"
#include "ff.h"
#include "string.h"
#include "stdio.h"
#include "stdlib.h"


// 全局变量
FATFS user_fs;     // FATFS文件系统对象
Config_t g_config = {1.0,100};   // 配置参数


/*********配置读取***********/
/**
 * @brief 去除字符串首尾空格
 * @param str 输入字符串
 * @return 处理后的字符串指针
 */
char* trim_whitespace(char* str) {
    char* end;
    
    // 去除前导空格
    while (*str == ' ' || *str == '\t' || *str == '\r' || *str == '\n') {
        str++;
    }
    
    if (*str == 0) return str;
    
    // 去除尾部空格
    end = str + strlen(str) - 1;
    while (end > str && (*end == ' ' || *end == '\t' || *end == '\r' || *end == '\n')) {
        end--;
    }
    end[1] = '\0';
    
    return str;
}

/**
 * @brief 解析配置文件中的键值对
 * @param line 配置文件行内容
 * @param key 键名
 * @param value 键值
 * @return 0:成功 -1:失败
 */
int parse_config_line(char* line, char* key, char* value) {
    char* eq_pos = strchr(line, '=');
    if (eq_pos == NULL) {
        return -1;  // 没有找到等号
    }
    
    // 分离键和值
    *eq_pos = '\0';
    strcpy(key, trim_whitespace(line));
    strcpy(value, trim_whitespace(eq_pos + 1));
    
    return 0;
}

/**
 * @brief 检查是否为目标段落 [Ch0]
 * @param line 配置文件行内容
 * @return 1:是Ch0段落 0:不是
 */
int is_ch0_section(char* line) {
    char* trimmed = trim_whitespace(line);
    return (strcmp(trimmed, "[Ch0]") == 0);
}

/**
 * @brief 读取config.ini配置文件（支持多section格式）
 * @return -4:成功 -1:文件不存在 -2:读取错误 -3:挂载失败
 */
Config_t read_config_ini(uint8_t check) 
{
    FIL file;
    FRESULT fr;
    char line_buffer[128];
    char key[64], value[64];
    int config_found = 0;
    int current_section = 0;  // 0:无 1:Ratio 2:Limit
    UINT bytes_read;
    
       
    // 尝试打开config.ini文件
    fr = f_open(&file, "config.ini", FA_READ);
    
    if (fr == FR_NO_FILE) 
    {
       user_printf(&huart3,"config.ini file not found\r\n");
        return g_config;  // 文件不存在
    } 
    else if (fr != FR_OK) 
    {
        user_printf(&huart3,"config.ini file open faild %d\r\n", fr);
        return g_config;  // 其他错误
    }
    
    // 逐行读取文件
    while (f_gets(line_buffer, sizeof(line_buffer), &file) != NULL) 
    {
        char* trimmed_line = trim_whitespace(line_buffer);
        
        // 跳过空行和注释行
        if (strlen(trimmed_line) == 0 || trimmed_line[0] == '#' || trimmed_line[0] == ';') 
        {
            continue;
        }
        
        // 检查section
        if (trimmed_line[0] == '[') 
        {
            if (strcmp(trimmed_line, "[Ratio]") == 0) 
            {
                current_section = 1;
                //user_printf(&huart1,"进入Ratio段落\r\n");
            } 
            else if (strcmp(trimmed_line, "[Limit]") == 0) 
            {
                current_section = 2;
                //user_printf(&huart1,"进入Limit段落\r\n");
            }
            else 
            {
                current_section = 0;  // 其他段落
            }
            continue;
        }
        
        // 在对应section中解析Ch0键值对
        if (current_section > 0) 
        {
            if (parse_config_line(trimmed_line, key, value) == 0) 
            {
                if (strcmp(key, "Ch0") == 0) 
                {
                    if (current_section == 1) 
                    {  // Ratio section
                        g_config.ratio = atof(value);
                        config_found = 1;
                        //user_printf(&huart1,"找到Ratio Ch0: %.2f\r\n", g_config.ratio);
                    } 
                    else if (current_section == 2) 
                    {  // Limit section
                        g_config.limit = atof(value);
                        config_found = 1;
                        //user_printf(&huart1,"找到Limit Ch0: %.2f\r\n", g_config.limit);
                    }
                }
            }
        }
    }
    
    f_close(&file);
    
    if (config_found) 
    {
        //user_printf(&huart1,"配置文件读取成功\r\n");
        switch(check)
        {
            case 0://只读
                ;
            break;
            
            case 1://存储ratio
				char flash_limit_dat[256];
				char flash_r_dat[256];
				float temp_1,temp_2;
				memset(flash_r_dat, 0, SPI_FLASH_PAGE_SIZE);
				spi_flash_buffer_read(flash_r_dat, CONFIG_ADDR_1, SPI_FLASH_PAGE_SIZE);
				sscanf(flash_r_dat,"[Ratio]=%f,[Limit]=%f",&temp_1,&temp_2);

				sprintf(flash_limit_dat, "[Ratio]=%.2f,[Limit]=%.2f",g_config.ratio,temp_2);
				flash_write(CONFIG_ADDR_1,flash_limit_dat);			
            break;
            
            case 2://全存
				char flash_w_dat[256];
				sprintf(flash_w_dat,"[Ratio]=%.2f,[Limit]=%.2f",g_config.ratio,g_config.limit);
				flash_write(0,flash_w_dat);
            break;
        }
        return g_config;
    } 
    else 
    {
        user_printf(&huart1,"配置文件格式错误\r\n");
        return g_config;
    }
}

/*********变比设置***********/
/**
 * @brief 更新配置文件中的值（简化版本 - 完全重写文件）
 * @param section_name 段落名称 ("Ratio" 或 "Limit")
 * @param new_value 新的值
 * @return 0:成功 -1:失败
 */
int update_config_value(const char* section_name, float new_value) 
{
    FIL file;
    FRESULT fr;
    
    // 读取当前配置
    Config_t backup_config = read_config_ini(0);
    
    // 更新指定的值
    if (strcmp(section_name, "Ratio") == 0) 
    {
        backup_config.ratio = new_value;
    } 
    else if (strcmp(section_name, "Limit") == 0) 
    {
        backup_config.limit = new_value;
    } 
    else 
    {
        user_printf(&huart3,"未知的段落名称: %s\r\n", section_name);
        return -1;
    }
    
    
    // 重新创建整个配置文件
    //f_unlink("config.ini");
    fr = f_open(&file,"config.ini", FA_CREATE_ALWAYS | FA_WRITE);
    if (fr != FR_OK) 
    {
        user_printf(&huart3,"无法创建配置文件: %d\r\n", fr);
        g_config = backup_config;  // 恢复备份
        return -1;
    }
    
    // 按照你的格式写入配置
		
	char config_content[128];
	sprintf(config_content, "[Ratio]\r\nCh0 = %.2f\r\n[Limit]\r\nCh0 = %.2f\r\n", backup_config.ratio, backup_config.limit);

	UINT bytes_written;
	f_write(&file, config_content, strlen(config_content), &bytes_written);
		
    f_close(&file);
    
		return 0;
}


